도커와 쿠버네티스 시작하기

쿠버네티스와 클라우드 네이티브

쿠버네티스 이슈

쿠버네티스란?
컨테이너 기반 오픈소스 가상화 프로젝트.
CNCF에서 관리 중
점차 쿠버네티스 지원 기업 증가 중
Pasted image 20240619172558.png
쿠버네티스에서 많이 활용되는 애플리케이션들
Pasted image 20240619172907.png

쿠버네티스의 장점을 알아보기 위해 몇 가지 용어와 지식을 보도록 한다.

클라우드 네이티브란?

CNCF의 클라우드 네이티브 정의
Pasted image 20240619174810.png
클라우드의 장점을 최대한 활용하여 정보 시스템을 구축 및 실행하는 환경
클라우드 환경을 통해 이뤄지는 다양한 기술, 패턴, 방법론을 포괄함
쿠버네티스는 클라우드 네이티브 구성요소를 완전히 수행할 수 있는 최고의 플랫폼

기존 앱과 클라우드 네이티브 앱의 차이점

기존 앱은 장기간에 걸쳐 결합되는 모놀리틱 아키텍쳐를 기반으로 함.
클라우드는 마이크로서비스로 구성하여 가상 컨테이너 환경에서 동작하도록 구현
Pasted image 20240619175003.png
이것은 매우 나이브한 구분이지만, 클라우드 환경이 가지는 특징을 개괄적으로 확인할 수 있다.

클라우드 네이티브 애플리케이션의 차별점

컨테이너 환경을 주로 활용하기에 이식성과 독립성이 보장된다.
환경이 가벼워지고 작은 구조의 서비스를 단위로 하니 애자일에 적합하며, 애자일 방법론을 가능하게 해준다.
CICD, 자동화를 통해 운영이 개발과 긴밀한 연관을 맺게 되며 데브옵스가 가능해진다.

클라우드 네이티브 구성 요소

NIA에서 발행한 클라우드 네이티브 정보시스템을 위한 발주자 안내서에는 다음과 같이 정의한다.

모놀리틱 아키텍쳐

전통적인 아키텍처로, 서비스가 하나의 앱 속에서 동작
기능이 많아지면서 거대해짐

다음의 단점을 가진다.

마이크로서비스 아키텍쳐

모놀리틱의 대안
애플리케이션의 각 기능을 분리하여 개발 및 관리

다음의 장점을 가진다.

다음의 문제를 가질 수 있다.

이를 해결하기 위해 쿠버네티스가 도입되는 것이다.

데브옵스 모델

개발과 운영의 협업을 통해 전체 라이프사이클을 관리하는 철학 또는 운동
팀 간의 프로세스를 자동화하는 일련의 과정으로도 정의

장점

기본적으로 개발자와 시스템 관리자는 관점이 다른데, 이를 통합시키는 과정이라고 할 수 있다.

이러한 불편함을 해소하는 것이 데브옵스의 의의

마이크로서비스 성공 사례

넷플릭스

2013년 최초의 마이크로서비스
Pasted image 20240619182119.png
VM을 통해 수백 개의 서비스 운영
유레카와 같은 자바 진영의 MSA 라이브러리와 툴을 개발함

2000년 당시 문제

이로부터 넷플릭스는 두 가지 변화를 이끌었다.

아마존

2000년대 당시 문제

이를 타파하고 2015년 마이크로서비스 발표
보안-개발-운영자-DB-기획으로 나뉘어지던 팀을 서비스 별로 2피자(8명)팀으로 구성
수천 개의 자율적 데브옵스팀이 존재하고 각 팀이 서비스를 담당함

가상화 개념과 컨테이너

가상화란 무엇일까?

하드웨어에 종속된 리소스를 추상화시켜 유용한 IT 서비스를 만드는 기술
물리적 머신의 기능을 여러 환경에 배포하여 효율적으로 자원 활용

가상화의 역사

IBM에 의해 1860년대부터 시작했으나, 2000년대 초 본격 도입
하이퍼바이저 같은 기술이 개발되어 한 컴퓨터에 여러 명이 액세스 가능해짐
기존에는 하드웨어 벤더 사에 앱 환경이 종속되는 이슈가 존재

하이퍼바이저 정의와 가상화 원리

Pasted image 20240619183828.png
하드웨어를 파티셔닝하고 물리적 리소스를 분리
이 기능을 수행하는 것이 하이퍼바이저
호스트 컴퓨터에서 여러 OS를 동시에 실행하는 논리적 플랫폼

두 종류가 존재한다.

VM은 오버헤드가 크다.
하이퍼바이저, OS가 독립적으로 구성되기 때문

컨테이너

가상환경을 통해 마이크로서비스를 격리하는 기본 기술
컨테이너 런타임 프로세스를 활용
하드웨어를 구현하지 않기에 매우 빠름
격리된 프로세스가 host OS의 자원을 활용함
Pasted image 20240619193653.png
cpu사용량은 native와 비교해서 1퍼센트 정도밖에 차이나지 않는다.

리눅스 네임스페이스

컨테이너를 격리하는 기술
Pasted image 20240619193820.png
각 프로세스 별로 파일 시스템, 네트워크, 유저 호스트네임 등을 격리할 수 있음

cgroups

프로세스의 리소스를 제한하는 기술
cpu, 메모리 등을 분리

union mount file system

동일 디렉토리에 여러 파일 시스템을 마운트하는 기술
먼저 마운트된 것 위에 추가적 마운트 실행
겹치는 것이 있을 경우 덮어씌워짐
레이어를 분리시키고, 원본을 저장하며 원하는 최종본을 만들 수 있음

도커

컨테이너 기술을 지원하는 프로젝트 중 하나
사실상 표준으로 자리잡음
애플리케이션에 국한되지 않고 의존성, 파일 시스템을 전부 패키징하여 빌드 및 배포를 단순화
Pasted image 20240619194317.png
아키텍쳐

containerD의 역사

2013년 도커의 구성 요소로 출발
2017년 독립형 프로젝트로 분리 후 CNCF에 기부됨
쿠버네티스의 컨테이너 런타임의 표준으로 자리잡음

레지스트리 연동, 컨테이너 관리와 관련된 하위 수준의 작업을 처리

컨테이너의 진화

Pasted image 20240619194742.png
초기 쿠버네티스는 도커를 컨테이너 기술로 활용
당시에는 dockershim이라는 도커의 스펙에 호환되는 프로세스를 사용
그러나 2020년 이후 효율적인 작업을 위해 도커를 분리하고 오픈소스인 containerd를 기반으로 재구축
이후에는 containerd가 자체저긍로 CRI의 모든 역할을 담당

컨테이너 레지스트리

레지스트리는 이미지 저장소
대표적으로 docker hub가 있으며, 클라우드 벤더 별로 또 존재.
harbor를 통해 프라이빗 레지스트리를 구축 가능

도커의 한계

서비스가 커질수록 컨테이너 양이 급격히 증가
관리가 어려워짐
컨테이너 배치, 배포 전략을 복합적으로 다루기 어려움

쿠버네티스

Pasted image 20240619195635.png
2014년 구글이 공개한 오픈소스
컨테이너 운영 노하우가 담긴 오픈소스
다수의 컨테이너를 운영하는 오케스트레이션 도구
많은 시스템을 통합하고 컨테이너를 제공하기 위한 API 제공

컨테이너 기본 사용 방법

설치는 다양한 자료가 있으니 그걸 참고하도록 한다.

# search app in docker registry
docker search <image>

# show info
docker info

# show info of image
docker inspect <image>

docker run -d --name <name> -p <hostPort>:<containerPort> <image>

dockre exec -ti <name> bash

docker logs <name>

# vice versa
docker cp <path> <container>:<path>

docker stop `docker ps -a -q`

레지스트리

도커 허브를 무료로 사용할 수 있다.

도커 라이프 사이클

Pasted image 20240619201814.png
run은 pull, create, start의 작업을 통칭할 수 있다.
대신 start의 명령을 무조건 실행하므로, create의 명령이 실행할 때만 사용하는 것이 권장됨
commit을 통해 컨테이너 자체를 이미지화시킬 수 있음

이미지 레이어

Pasted image 20240619203248.png
이미지는 레이어로 이뤄져 있으며, 공유할 수 있는 레이어를 서로 공유함
A를 지우더라도, 레이어 abc는 지워지지 않음

스크린샷 2024-06-19 20-40-26.png
이미지 inspect를 하면 이런 모양을 볼 수 있다.
스크린샷 2024-06-19 20-40-49.png
파일시스템에 어떻게 레이어가 돼있는지에 대한 정보도 나온다.
이들에 대한 정보는 image 디렉에 있고, 실질 정보는 overlay2에 있다.
스크린샷 2024-06-19 20-41-56.png
image 디렉 내부에는 imagedb가 있고, 이것이 사용자가 흔히 보는 해시 값을 가진다.
스크린샷 2024-06-19 20-47-52.png
layerdb도 있는데 이건 이미지를 구성하는 레이어에 대한 정보를 담는다.
스크린샷 2024-06-19 20-49-42.png
각 레이어에는 cachedid가 있는데 이 해시 값은 overlay에 들어간 파일과 연관된다.
스크린샷 2024-06-19 20-52-15.png
overlay2에는 실질적인 파일 정보가 들어간다.
l은 각 레이어의 정보를 가져와서 링킹되어있는 파일이다.
스크린샷 2024-06-19 20-48-07.png
스크린샷 2024-06-19 20-37-01.png
파일상으로 확인할 수 있는 레이어의 구조는 이렇다.

이미지 정보는 image, 실질 데이터는 overlay2임을 기억하자.
스크린샷 2024-06-19 20-58-11.png
그래서 데이터도 overlay가 엄청 크다.
모든 레이어의 정보를 저장하기 때문

자잘한 팁

이미지를 inspect해서 열린 포트를 확인할 수 있다
현재 디렉터리를 마운트하고 싶다면 "$PWD" 입력.
마운트 때 :ro를 넣으면 읽기 전용으로 컨테이너에 마운트된다.

컨테이너 개발과 저장소 활용